import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter
import matplotlib.colors as mcolors
import matplotlib.font_manager as fm

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 初始化画布
fig, ax = plt.subplots(figsize=(10, 5))
ax.set_xlim(0, 10)
ax.set_ylim(0, 5)
ax.set_facecolor('white')  # 设置画布背景颜色为白色
ax.axis('off')  # 关闭坐标轴

# 定义文字和位置
texts = ["五", "一", "快", "乐"]
x_pos = np.linspace(2, 8, len(texts))  # 在横向均匀分布
y_pos = np.ones(len(texts)) * 2.5  # 初始垂直位置在中间

# 初始化文字对象列表
text_objects = []
for i in range(len(texts)):
    text_obj = ax.text(x_pos[i], y_pos[i], texts[i], fontsize=60, verticalalignment='center',
                       horizontalalignment='center', color='black')
    text_objects.append(text_obj)

# 初始化每个字的状态（用于动画）
states = [{'alpha': np.random.uniform(0.3, 0.8), 'color': np.random.choice(list(mcolors.TABLEAU_COLORS.values())),
           'offset': np.random.uniform(0, 2 * np.pi)} for _ in range(len(texts))]

# 动画更新函数
def update(frame):
    for i, text_obj in enumerate(text_objects):
        # 更新透明度
        states[i]['alpha'] = np.random.uniform(0.3, 0.8)
        text_obj.set_alpha(states[i]['alpha'])

        # 更新颜色（可以注释掉这一行，如果不需要颜色变化）
        states[i]['color'] = np.random.choice(list(mcolors.TABLEAU_COLORS.values()))
        text_obj.set_color(states[i]['color'])

        # 更新垂直位置（上下波动）
        new_y = 2.5 + np.sin(frame / 10 + states[i]['offset']) * 0.5
        text_obj.set_position((x_pos[i], new_y))
    return text_objects

# 创建动画
ani = FuncAnimation(fig, update, frames=100, interval=100, blit=True)

# 保存为GIF
writer = PillowWriter(fps=10)  # 设置帧率
ani.save("may_day_animation.gif", writer=writer)

# 显示动画（可选，用于预览）
plt.show()